/**
 * CommonTypes.h
 *
 *  Created on: 27/12/2009
 *      Author: San Martín, Matías I.
 *
 *  Tipos comunes para el middleware
 */

#ifndef MIDDLEWARE_COMMONTYPES_H_
#define MIDDLEWARE_COMMONTYPES_H_

#include <string>
#include <stdint.h>
#include <rpc/rpc.h>

#include "../../Framework/Shared/shmap.h"
#include "../../Framework/Shared/shlist.h"

using std::string;

namespace middleware {
namespace common {

/**
 *  Tipos creados por Juan en el desarrollo del nodo Jugador. Intenté que
 *  quede prolija la separación entre dirección y id de aplicación.
 *  Revisar!
 */

#define MAX_DATOS 1024

#define CLIENTE_FTOK_FILENAME 	CONFIG_FILENAME
#define CLIENTE_QRCV_PROJID 	('R')
#define CLIENTE_QSND_PROJID 	('S')
#define CLIENTE_QALC_PROJID 	('A')
#define CLIENTE_QRNG_PROJID 	('M')

typedef uint32_t Direccion;

typedef uint32_t Longitud;

typedef uint32_t Cantidad;

typedef uint32_t Minutos;

typedef uint32_t Secuencia;

typedef enum { 	OP_HANDSHAKE_REQ=1,
				OP_HANDSHAKE_RES,
				OP_DATA,
				OP_NUEVO_ANILLO,
				OP_AGREGAR_RECEPTOR,
				OP_QUITAR_RECEPTOR
} Operacion;

typedef struct {
	string host;
	int port;
} DireccionTCP;

typedef struct {
	uint8_t protocolo[2];
	uint8_t version;
	Direccion destino;
	Direccion origen;
	uint8_t operacion;
	Secuencia secuencia;
	Longitud ldatos;
	uint8_t datos[MAX_DATOS];
} PDUPuntoAPunto;

#define MAX_LINEAS_TCP 20

typedef std::pair<pid_t, pid_t> ParEmisorReceptor;
typedef SharedMap<Direccion, ParEmisorReceptor, MAX_LINEAS_TCP> MapaLineasTCP;
typedef SharedList<Direccion, MAX_LINEAS_TCP> ListaReceptores;

/** direcciones de middleware reservadas */
#define DIR_INVALIDA  0x00000000
#define DIR_RESERVADA 0x40000000
#define DIR_MULTICAST (DIR_RESERVADA+1)

/** números de secuencia de mensajes */
#define SECUENCIA_UNICAST 1
#define SECUENCIA_INICIAL 2

/**
 * Fin de tipos creados por Juan.
 */

//debe poder ser traducido de y hacia un T_ID_UNIVERSO o T_ID_JUEGO
typedef int T_ID_CONTENEDOR;
//debe poder ser traducido de y hacia un T_ID_PLANETA o T_ID_JUGADOR
typedef int T_ID_CONTENIDO;

typedef int T_ID_UNIVERSO;
typedef int T_ID_PLANETA;
typedef int T_ID_JUEGO;
typedef int T_ID_JUGADOR;

typedef int T_EXT_ID_JUGADOR;
typedef int T_EXT_ID_PLANETA;

//identificador univoco de planeta
struct uidPlaneta {
    T_ID_UNIVERSO id_universo;        //identificador del grupo de planetas al que pertenece el planeta
    T_ID_PLANETA    id_planeta;        //identificador del planeta (relativo al universo)
};

//identificador univoco de jugador
struct uidJugador {
    T_ID_JUEGO id_juego;        //identificador del grupo de jugadores al que pertenece el jugador
    T_ID_JUGADOR    id_jugador;        //identificador del jugador (relativo al juego)
};


} //namespace common
} //namespace middleware

#endif /* MIDDLEWARE_COMMONTYPES_H_ */
